package com.cotasul.tela;

import java.io.InputStream;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;

import org.primefaces.context.RequestContext;
import org.primefaces.event.FlowEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.cotasul.bean.CompradorBean;
import com.cotasul.bean.FornecedorBean;
import com.cotasul.bean.TipoBean;
import com.cotasul.bean.UsuarioBean;
import com.cotasul.negocio.CompradorServico;
import com.cotasul.negocio.FornecedorServico;
import com.cotasul.negocio.TipoServico;
import com.cotasul.negocio.UsuarioServico;

@ManagedBean
@RequestScoped
public class IndexTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private UsuarioServico<UsuarioBean> servico = new UsuarioServico<UsuarioBean>();

	private StreamedContent file;

	private String opcao;

	private TipoServico<TipoBean> tipoServico;
	
	@ManagedProperty(value = "#{fornecedorBean}")
	private FornecedorBean fornecedor;
	
	private FornecedorBean fornecedorNovo;

	@ManagedProperty(value = "#{compradorBean}")
	private CompradorBean comprador;
	
	private CompradorBean compradorNovo;

	private CompradorServico<CompradorBean> compradorServico;

	private FornecedorServico<FornecedorBean> fornecedorServico;

	private UsuarioBean user;

	private TipoBean tipo;

	private UsuarioServico<UsuarioBean> usuarioServico;

	public IndexTela() {
		InputStream stream = ((ServletContext) FacesContext
				.getCurrentInstance().getExternalContext().getContext())
				.getResourceAsStream("/download/ChromeSetup.exe");
		file = new DefaultStreamedContent(stream, "application/download",
				"ChromeSetup.exe");
		tipoServico = new TipoServico<TipoBean>();
		tipo = new TipoBean();
		fornecedorNovo = new FornecedorBean();
		fornecedorNovo.setTipo(tipo);
		compradorNovo = new CompradorBean();
		user = new UsuarioBean();
		fornecedorServico = new FornecedorServico<FornecedorBean>();
		compradorServico = new CompradorServico<CompradorBean>();

	}

	private boolean verificaNavegador() {
		boolean permite = true;

		String userAgent = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestHeaderMap().get("User-Agent");
		Pattern pattern = Pattern.compile("MSIE");
		Matcher matcher = pattern.matcher(userAgent);
		if (matcher.find()) {
			String versao = userAgent.substring(userAgent.indexOf("MSIE") + 5,
					userAgent.indexOf("MSIE") + 6);
			int versaoNum = Integer.parseInt(versao.trim());
			if (versaoNum < 9) {
				permite = false;
			}
		}

		return permite;
	}

	public String logar() {

		if (verificaNavegador()) {

			FacesMessage msg = null;
			boolean enviado = false;
			String url = "/principal.xhtml?faces-redirect=true";
			try {
				usuario = this.getServico().logar(usuario);
				if (usuario != null) {
					if (usuario.getNome() != null) {
						if (usuario.getAtivo() != null
								&& usuario.getAtivo().equals("Sim")) {
							msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
									this.getServico().getValor(
											"msg_header_sucesso"), this
											.getServico().getValor(
													"msg_body_sucesso"));
							if(usuario.getTipo().equals("Fornecedor")){
								fornecedor.setUsuario(usuario);
								fornecedor = fornecedorServico.buscaFornecedor(fornecedor);
							}else if(usuario.getTipo().equals("Comprador")){
								comprador.setUsuario(usuario);
								comprador = compradorServico.buscaComprador(comprador);
							}
							enviado = true;
						} else {
							msg = new FacesMessage(FacesMessage.SEVERITY_WARN,
									this.getServico().getValor(
											"msg_header_erro"), this
											.getServico().getValor(
													"msg_body_erro_ativo"));
							enviado = false;
						}
					} else {
						msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
								this.getServico().getValor("msg_header_erro"),
								this.getServico().getValor("msg_body_erro"));
					}

				} else {
					msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
							.getServico().getValor("msg_header_erro"), this
							.getServico().getValor("msg_body_erro"));
				}
			} catch (Exception e) {
				msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, this
						.getServico().getValor("msg_header_erro"), this
						.getServico().getValor("msg_body_erro"));
				e.printStackTrace();
			}

			FacesContext.getCurrentInstance().addMessage(null, msg);

			return enviado ? url : null;

		} else {
			RequestContext.getCurrentInstance()
					.execute("barraNavegador.show()");
			return null;
		}
	}

	public String onFlowProcess(FlowEvent event) {
		String aba = event.getNewStep();
		if (!aba.equals("tab1")) {
			if (event.getNewStep().equals("fornece")
					&& event.getOldStep().equals("compra")) {
				aba = "tab1";
			} else {
				if (opcao.trim().equals("1")) {
					aba = "fornece";
				} else {
					aba = "compra";
				}
			}
		}
		return aba;
	}

	public void validador(FacesContext fc, UIComponent ui, Object objeto) {
		String cod = objeto.toString();
		if (ui.getId().trim().equals("fLogin")
				|| ui.getId().trim().equals("cLogin")) {
			try {
				usuarioServico = new UsuarioServico<UsuarioBean>();
				if (!usuarioServico.validaNomeUsuario(cod)) {
					((UIInput) ui).setValid(false);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void salvar(String opcao) {
		try {
			if (opcao.equals("2")) {
				compradorNovo.setUsuario(user);
				compradorServico = new CompradorServico<CompradorBean>();
				compradorServico.salvar(compradorNovo);
			} else {
				fornecedorNovo.setUsuario(user);
				fornecedorNovo.setTipo(tipo);
				fornecedorServico.salvar(fornecedorNovo);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List<TipoBean> getPreencheCombo() {
		try {
			return tipoServico.buscaTipos();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected UsuarioServico<UsuarioBean> getServico() {
		return servico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public StreamedContent getFile() {
		return file;
	}

	public String getOpcao() {
		return opcao;
	}

	public void setOpcao(String opcao) {
		this.opcao = opcao;
	}

	public TipoServico<TipoBean> getTipoServico() {
		return tipoServico;
	}

	public void setTipoServico(TipoServico<TipoBean> tipoServico) {
		this.tipoServico = tipoServico;
	}

	public void setServico(UsuarioServico<UsuarioBean> servico) {
		this.servico = servico;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}

	public FornecedorBean getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(FornecedorBean fornecedor) {
		this.fornecedor = fornecedor;
	}

	public CompradorBean getComprador() {
		return comprador;
	}

	public void setComprador(CompradorBean comprador) {
		this.comprador = comprador;
	}

	public TipoBean getTipo() {
		return tipo;
	}

	public void setTipo(TipoBean tipo) {
		this.tipo = tipo;
	}

	public UsuarioBean getUser() {
		return user;
	}

	public void setUser(UsuarioBean user) {
		this.user = user;
	}

	public CompradorServico<CompradorBean> getCompradorServico() {
		return compradorServico;
	}

	public void setCompradorServico(
			CompradorServico<CompradorBean> compradorServico) {
		this.compradorServico = compradorServico;
	}

	public FornecedorServico<FornecedorBean> getFornecedorServico() {
		return fornecedorServico;
	}

	public void setFornecedorServico(
			FornecedorServico<FornecedorBean> fornecedorServico) {
		this.fornecedorServico = fornecedorServico;
	}

	public FornecedorBean getFornecedorNovo() {
		return fornecedorNovo;
	}

	public void setFornecedorNovo(FornecedorBean fornecedorNovo) {
		this.fornecedorNovo = fornecedorNovo;
	}

	public CompradorBean getCompradorNovo() {
		return compradorNovo;
	}

	public void setCompradorNovo(CompradorBean compradorNovo) {
		this.compradorNovo = compradorNovo;
	}
	
	

}
